package br.com.mftc.efitness.negocio;

import java.util.List;

import br.com.mftc.efitness.basicas.Academia;
import br.com.mftc.efitness.dados.DadosAcademia;
import br.com.mftc.efitness.dados.IDadosAcademia;
import br.com.mftc.efitness.excecoes.ExcecaoCamposObrigatoriosNaoPreenchidos;
import br.com.mftc.efitness.excecoes.ExcecaoCaracteresEspeciaisNaoSaoPermitidos;
import br.com.mftc.efitness.excecoes.ExcecaoGeral;
import br.com.mftc.efitness.excecoes.ExcecaoNegocio;
import br.com.mftc.efitness.util.Util;
import br.com.mftc.efitness.util.Variaveis;

public class ControladorAcademia {

	private final IDadosAcademia dadosAcademia;
	
	public ControladorAcademia() {
		dadosAcademia = new DadosAcademia();
	}
	
	public Academia validarDados(Academia academia) throws ExcecaoCamposObrigatoriosNaoPreenchidos, ExcecaoCaracteresEspeciaisNaoSaoPermitidos, ExcecaoNegocio {
		if (academia == null) {
			throw new ExcecaoNegocio(Variaveis.EXCECAO_ACADEMIA_INFORME_REGISTRO_VALIDO);
		} else if (academia.getRazaoSocial() == null || academia.getRazaoSocial().trim().equals("")) {
			throw new ExcecaoCamposObrigatoriosNaoPreenchidos();
		} else if (Util.contemCaracteresEspeciais(academia.getRazaoSocial())) {
			throw new ExcecaoCaracteresEspeciaisNaoSaoPermitidos();
		} else if (academia.getNomeFantasia() == null || academia.getNomeFantasia().trim().equals("")) {
			throw new ExcecaoCamposObrigatoriosNaoPreenchidos();
		} else if (Util.contemCaracteresEspeciais(academia.getNomeFantasia())) {
			throw new ExcecaoCaracteresEspeciaisNaoSaoPermitidos();
		} else if (academia.getCnpj() == null || academia.getCnpj().trim().equals("")) {
			throw new ExcecaoCamposObrigatoriosNaoPreenchidos();
		} else {			
			if (!Util.validarCnpj(academia.getCnpj())) {
				throw new ExcecaoNegocio(Variaveis.EXCECAO_ACADEMIA_CNPJ_INVALIDO);
			}
		}
		
		if (academia.getEndereco() != null) {
			if (academia.getEndereco().getLogradouro() != null) {				
				if (academia.getEndereco().getLogradouro().trim().equals("")) {
					academia.getEndereco().setLogradouro(null);
				} else if (Util.contemCaracteresEspeciais(academia.getEndereco().getLogradouro())) {
					throw new ExcecaoCaracteresEspeciaisNaoSaoPermitidos();
				}
			}
			if (academia.getEndereco().getNumero() != null) {
				if (academia.getEndereco().getNumero().trim().equals("")) {
					academia.getEndereco().setNumero(null);
				} else if (Util.contemCaracteresEspeciais(academia.getEndereco().getNumero())) {
					throw new ExcecaoCaracteresEspeciaisNaoSaoPermitidos();
				}
			}
			if (academia.getEndereco().getComplemento() != null) {
				if (academia.getEndereco().getComplemento().trim().equals("")) {
					academia.getEndereco().setComplemento(null);
				} else if (Util.contemCaracteresEspeciais(academia.getEndereco().getComplemento())) {
					throw new ExcecaoCaracteresEspeciaisNaoSaoPermitidos();
				}
			}
			if (academia.getEndereco().getBairro() != null) {
				if (academia.getEndereco().getBairro().trim().equals("")) {
					academia.getEndereco().setBairro(null);
				} else if (Util.contemCaracteresEspeciais(academia.getEndereco().getBairro())) {
					throw new ExcecaoCaracteresEspeciaisNaoSaoPermitidos();
				}
			}
		}
		
		return academia;
	}
	
	public Academia inserir(Academia academia) throws ExcecaoCamposObrigatoriosNaoPreenchidos, ExcecaoCaracteresEspeciaisNaoSaoPermitidos, ExcecaoNegocio, ExcecaoGeral {
		academia = validarDados(academia);
		
		try {
			academia.setCnpj(Util.removerMascara(academia.getCnpj()));
			academia.getEndereco().setCep(Util.removerMascara(academia.getEndereco().getCep()));
			
			academia.setDataDeCriacao(Util.agora());
			academia.setDataDeUltimaAtualizacao(Util.agora());
			
			dadosAcademia.iniciarTransacao();
			dadosAcademia.inserir(academia);
			dadosAcademia.finalizarTransacao();
			
			return academia;
		} catch (Exception excecao) {
			try {
				dadosAcademia.desfazerTransacao();
				throw new ExcecaoNegocio(Variaveis.EXCECAO_PERFIL_DE_USUARIO_FALHA_INSERIR);
			} catch (Exception excecaoAux) {
				throw new ExcecaoGeral();
			}
		}
	}
	
	public List<Academia> consultarTodos() {
		return dadosAcademia.consultarTodos();
	}
}
